パソコン活用研究ラピュタへの道(アセンブラ、DOS、Windows、旧型PCの活用研究) RS232Cプロジェクト 著作者 河西 1 はじめに(RS232Cプロジェクト) 最近、WINDOWSで使えるF-Basic、N88Basicなどが市販されているようですが、 もし、昔のふるーい8ビット機(FM-7/8、PC-88)なんかが、まだ あったりして(そんな人はごくまれだと思いますが)、それらの8ビット機上 のBasic プログラム なんかをWINDOWS機に移植したいと思ったら、どうしたら 良いでしょうか。おそらく、RS232Cでデータを転送するしかないと思います。 かくいう筆者も、FM-8(OSはF-Basicスタンドアロン、CP/M)、PC-2001(N20Basic スタンドアロン)、PC-98(OSはN88Basicスタンドアロン,MS-DOS)、DOS/V(Win95) などを所有しており、各機種間でソースファイルやデータファイルの交換の 必要性にせまられました。そこで、各機種間全てでデータおよびプログラムの 相互転送、共有化をはかるのを目的としてRS232Cプロジェクトをスタートしました。 ふるーいパソコンをお持ちの皆さん、RS232Cで活用してあげましょう。 当原稿は、シリアルデータ通信について概略を説明しました。 2 移植に立ちはだかる互換性の壁 ここ10数年で、急速に進歩してきたパソコンで、常に悩まされたのはパソコン間の 互換性の問題ではないでしょうか。新しい機種を買うごとに、他メーカーのものに乗り換える ごとに、それまでの資産(データファイル、ソースファイル他)が継承できるかどうか が、いつも問題としてつきまといました。CPU,ハードアーキテクチャ、OSが違えば まず互換性はないといっても良いでしょう。互換性の壁を乗り越えるべく、いろんな コンバート用のプログラムが編み出され、また最近は、ある点ではフォーマットの共通化 が進んできています。しかし、最近でも同じ8086系CPU,同じOS(MS-DOS) を使用しながらPC-98とDOS/V(PC/AT互換機)で2HDのフロッピーディスク(以下FDと略す)は フォーマットの違いで、データファイルすらやりとりできず、大昔でいえば、同じCPU(Z80) 同じOS(CP/M)を使用しながら、各メーカのCP/M機間で互換性がなかったものです。 筆者のパソコンでいえば、プログラムの保存メディアは、FM-8は5”2DDのFD (今はもう販売してない)、PC-2001はテープのみ、PC-98は3.5”FDだが、 1.2Mフォーマット。DOS/Vは3.5”の1.44Mフォーマットという具合なので、 相互にデータ交換しようとしても、まったく不可能なのです。これらの機種で残された手段 というと、RS232Cしかないと言って良いでしょう。 3 RS232Cとは (1) シリアルデータ転送 RS232Cはシリアルデータ転送(直列データ転送)の1つの規格で、アメリカ電子工業 規格できちんと定められた規格です。各パソコンのシリアルデータ転送ポート(以下SPと 略す)は一応みなRS232C規格に準拠して設計されており、各パソコン間で互換性の 非常に高いデバイスです。SPの用途としては、現在ではモデムをつなぐというのが、もっとも 一般的だと思います(2000年以前の話)。 (2) RS232C規格概要 RS232Cの規格のうち非常に重要なものとして定められている、信号線の機能について 概要を説明します。 DB 25ピンのシリアルポート(PC9801シリーズ)のピンの配置 __________________________________ | 1 2 3 4 5 6 7 8 9 10 11 12 13 | PC98背面 | 14 15 16 17 18 19 20 21 22 23 24 25 | | _________________________________| 信号 ピン 機能 GND 1 アース TXD 2 送信データ RXD 3 受信データ RTS 4 モデムへの送信要求 CTS 5 モデムからの送信可能信号 DSR 6 モデムからの動作可能信号 DCD 8 キャリア検出(モデムが相手方のデータ受信中) RXC 17 受信クロック DTR 20 ターミナル(パソコン)の動作可能信号 TXC 24 送信クロック出力 上記のピン配置はPC9801シリーズのものです。 DB9ピン (DOS/V機等) 背面からみた図 ______________ |1 2 3 4 5 | | 6 7 8 9 | |______________| 信号 ピン DCD 1 RXD 2 TXD 3 DTR 4 GND 5 DSR 6 RTS 7 CTS 8 RI 9 RS232Cでは、RTS,CTS,DSR,DTRが全てON(モデムもパソコンも 動作可能状態で、データ送信要求がなされた)時、TXDよりデータが送信されます。 (モデムが接続されている場合、パソコンからモデムにデータが転送され、モデムから 相手の機器にデータが送出される。) FM-8, PC2001のピン配置は「4 各機種間データ交信」に参考までに記述してあります。 (3) パソコン同士の結線 電子メール、インターネットの場合はモデムを介してデータのやりとりをしますが、 パソコンのSP同士をRS232Cケーブルでちょくせつ結線して、データ交換する 場合は上記より簡単な話になります。パソコン同士をつなぐ場合は、通常非同期式の データ通信なので、RXC,TXC(クロック入出力)は不要です。また、モデムを 使わないのでDCDも関係ありません。 すなわち、パソコン間のデータ転送では、7ピン(7つの信号)のみ使われます。 他のピンは使われません。7つの回線(信号)の機能は、TXD(送信)、RXD(受信)、 RTS(送信要求)、CTS(送信可)、DSR(データセットレディ)、GND(接地)、 DTR(データ末端レディ)です。 昔のBASICではRS232Cをオープンすると(OPEN文)、RTS(送信要求)、 DTR(データ末端レディ)がONになります。従って、下記のように結線すれば、 RTS,CTS,DSR,DTRの全てがONとなりデータの送信ができるように なります。 (その1) (その2) GND−−−−GND GND−−−−GND TXD−−−−RXD TXD−−−−RXD RXD−−−−TXD RXD−−−−TXD RTS−−−−CTS RTS− −RTS CTS−−−−RTS | | 自己結線 DSR−−−−DTR CTS− −CTS DTR−−−−DSR DSR− −DSR | | 自己結線 DTR− −DTR TXD,RXDは必ずクロスして結線します。(送信側のデータ送信と受信側のデータ受信 を結ぶ。当たり前ですが) その1の結線では、RTSとCTS、DTRとDSRをクロスさせ、それぞれのRTS,DTR のONが相手のCTS,DSRをONするようにします。 その2では、自分のRTSとCTS,DTRとDSRを自己結線し、自己のRTS,CTSのON が自己のCTS,DSRをONするようにします。ただし、この場合は相手のパソコンの状況 にかかわらず、データ送信可能となるので、あいてのパソコンの準備ができていなければ、 データは無駄な垂れ流しとなってしまいます。 さて、以上はパソコン間の結線でも比較的厳密な場合で、古いパソコンのBASICの場合 もっとルーズなケースが多いようです。古いBASICでは、DTRとDSRもまったく チェックしてないケースがほとんどです。従って、DTR,DSRを無視して、5本の信号線 だけで、送受信可となります。 更には、GND−−−GND,TXD−−−RXD,RXD−−−TXDの3本だけでO.K. という場合も結構あります。 結局、25ピンのうち3ピンだけで用がたりてしまうわけです。RS232Cは 各電子機器間のデータ送受信、あるいはパソコンから周辺機器の制御をするため に定められた工業規格で、結講きちんとした規格です。しかし、古いBASICではその ごく1部の機能しか使用しておらず、細かいことは無視しています。 (4) 通信プロトコル パソコン同士をつなぐ場合であっても、お互いに通信条件について一致させておかないと、 データのやりとりができません。設定すべき条件として一般的には以下のものがあります。 @ ボーレート(データ転送スピード) データ転送のスピードです。1秒間に転送するビット数をあらわします。 BASICでは、300、600、1200、2400、4800、9600ボー の中から選択することが多いと思います。 A ビット長 データの1文字をあらわすのに、7ビットで表すか、8ビットで表すかの選択です。 B ストップビット データの区切りとして、データの最後につけるのがストップビットです。これを、1ビット にするか2ビットにするか選択します。 C パリティチェック 送られてきた1文字分のデータに誤りがないか、確認するために付加するビットです。 偶パリ、奇パリ、パリティ無しから選択します。 D Xパラメータ データが受信能力を超えて送られてくると、受信バッファからデータがあふれて、データ の取りこぼしをしてしまいます。この時、送信側に一時的にデータ送信の停止を要求する ことができます。この機能のON(XON)、OFF(XOFF)をきめます。 受信側で受け取ったデータをプリンターに出力するなど、時間のかかる処理をする時には XONにします。ただし、昔のBASICシステムでは、送信側が停止の合図を受け取っても、 自動的には、送信停止にならないことが多いようです。BASICプログラムで停止の合図を うけたら、一時停止になるよう、プログラムする必要があります。 E Sパラメータ データビット長で7ビットを選択すると、(JISコード)カナ文字が送信できません。 SパラメータをONにすると、SOコード(以下のデータをカナとして扱う)、SIコード (以下のデータを英数文字として扱う)の送信がなされ、カナの送信も可能になります。 これ以外にも、各機種固有の設定(キャリッジリターンの取り扱いなど)がありますが、 ここでは割愛します。 4 各機種間のデータ交信 (1) コネクタ、ケーブル 筆者所有のパソコンのSPコネクタの形状についてのべます。 シリアル転送用コネクタは一般的には、PC-98系は25ピン(ノート型はハーフ14ピン もある。最近の機種はDOS/Vと同じく9ピンになっている)DOS/Vは9ピンです。 以上のものについては、市販のクロスケーブルが販売されてますので、接続は簡単です。 古いパソコンはコネクタが標準外のものが多く、PC2001は丸型8ピン、FM-8は特殊 な26ピン(なんせ古いマシンなもので、コネクタの形状が最近の標準品と違う)で、 市販のケーブルはもちろんありません。 従って、古い機種の場合はコンタクトピンにコードをはんだづけして、ケーブルを自作する しかありません。しかし、上述したように、実際に使う信号線は多くて5本なので、小さい ワニグチクリップでピンをはさんで結線させてもできます。 ちなみに、PC2001は信号線もまったく独自の仕様でTXD,RXD,GND,RTS, CTSに+5V,+12Vという変な信号になっています。 FM8のRS232C FM−8 ワニ口クリップではさんで結線。 これでO.K. FM−8のピン配置(背面からみた図) 25 23 21 19 17 15 13 ・・略・ 1 26 24 22 20 18 16 14 2 信号 ピン GND 14 CTS 18 *CTSとRTSは自己結線すればよい RTS 20 RXD 22 (受信データ) TXD 24 (送信データ) おまけにPC−2001のピン配置(丸型8ピン)(背面から) 8 7 6 5 4 3 2 1 信号 ピン GND 1 GND 2 RXD 3 +12V 4 TXD 5 RTS 6 +5V 7 CTS 8 (2) RS232Cインタフェースの使用によるデータ転送 @ もっとも単純なデータ送信 特にどうといこともありませんが、各機種で"A"をRS232Cで送信する実験用BASIC プログラムです。全てはこのプログラムからはじまると思います。(通信プロトコルはいずれも データビット長8ビット、ストプビット1ビット、パリティなし、X,SパラメータOFF 転送レート1200ボー) 一般にBASICでは、open文で通信条件を設定し、print文でデータを送出します。 各BASICでそれぞれの記述の仕方は若干異なります。 PC98 N88Basic 10 CLS 20 OPEN"COM1:N81NN"AS #1 'PC98では別のユーティリティで転送スピード設定 30 PRINT #1, "A" 'N81NN ノンパリ、8ビット長、ストップビット1、X/SパラOFF 40 CLOSE #1 PC2001 N20Basic 10 TERM J,0,4 '8ビット長、ノンパリ、1200ボー 20 PRINT %1, "A" FM-8 F-Basic 10 OPEN "O", #1, "COM0:S8N1" 'FM-8ではディプスイッチで転送スピードを設定 20 PRINT #1, "A" 'S8N1 SLOWモード、8ビット長、ノンパリ、ストップビット1 30 CLOSE DOS/V Visual Basic 4.0 以下のプログラムは主要な部分の抜粋です。VBではこれだけでは完全なプログラムに なっておりません。Visual Basicは旧来のBASICとはかなり仕様が異なります。 Begin MSCommLib.MSComm MSComm1 ’ここはRS232C通信用のMSComm.ocxのプロパティ Left = 5160 Top = 3600 _ExtentX = 1005 _ExtentY = 1005 _Version = 327680 DTREnable = -1 'True RThreshold = 1 End Private Sub Command1_Click() MSCom1.Portopen=true Baud = "1200" DB = "8" st="1" pari = "N" MSComm1.Handshaking = 0 MSComm1.Settings = Baud + "," + pari + "," + DB + "," + st MSComm1.Output = "A" End Sub A FM-8 Basicシステム F-Basicによるデータ送信 FM-8のBasicプログラムをアスキー形式(いわゆるテキストデータ)RS232C で送信するには、メモリーにプログラムを読み込んだ状態で、以下のコマンドでおこなえば 転送できます。 LIST "COM0:S8N1" 'データ長8ビット、パリティ無し、ストプップビット1 フロッピーディスク上のデータファイル、アスキーセーブのプログラムをRS232Cで 送信するプログラム 10 input "File Name"; Fname$ ’読み込みたいファイル名のしてい 20 open "I" ,#1, Fname$ ’ファイルのオープン 30 open "O", #2, "COM0:S8N1" ’データ長8ビット、パリティ無し、ストプップビット1 40 If eof(1)=-1 then goto80 ’ファイルが終わりなら80行へ飛ぶ 50 line input #1, D$ 60 print #2, D$ 70 goto40 80 close: end B FM-8 CP/Mの場合 CP/MでフロッピーディスクのファイルをRS232Cで送信するには、以下のコマンド で行います。(FILE1.FOR というファイルを転送する場合) A> STAT PUN:=TTY: A> PIP PUN:=FILE1.FOR [E] なお、ボーレート他の設定をするコマンドがCP/Mに見当たりません。FM-8の場合 ボーレートはディップスイッチで設定しますが、他のデータ長などは、F-Basicで 設定した条件がそのまま引き継がれているようです。 FM-7/8のファイルをRS232Cで送信する方法については、FM-7/8復活作戦-エミュレーター使用にもまとめました ので参照して下さい。 CPC98(Basicシステム、N88Basic) PC98でメモリー上のBasicプログラムをアスキー形式(いわゆるテキストデータ)RS232C で送信するには、以下の通りSAVEコンマンドでできます。 データビット長8ビット、ストプビット1ビット、パリティなし、X,SパラメータOFF SAVE "COM1:N81NN",A フロッピーディスク上のデータファイル、アスキーセーブのプログラムをRS232Cで 送信するプログラム 10 input "File Name"; Fname$ ’読み込みたいファイル名のしてい 20 open Fname$ for input as #1 ’ファイルのオープン 30 open "COM1:N81NN" as #2 ’データ長8ビット、パリティ無し、ストプップビット1 40 If eof(1)=-1 then goto80 ’ファイルが終わりなら80行へ飛ぶ 50 line input #1, D$ 60 print #2, D$ 70 goto40 80 close: end D PC98 MS-DOS フロッピーディスク上のファイルをRS232Cで転送する場合、RS232Cの通信条件 の設定は SPEEDコマンドで指定します A>SPEED 転送はCOPYAというコマンドを使います。File1.txt というファイルを転送する場合 A>COPYA File1.txt aux MS-DOSではRS232Cでのファイル受信時にもCOPYAを使います。 ただし、筆者の調べた限り、Windows95のMS-DOSモード、MS-DOSプロンプト にはCOPYAコマンドは用意されてません。 E PC2001 PC2001でテープに保存したデータファイルを読み込んで、RS232Cで外部に転送する というのは可能ですが、あまりに使用に耐えないものなので、ここではその手のプログラム は割愛します。メモリー上のデータの送信に主眼を置きます。 メモリー上のバイナリデータを文字データに変換してRS232Cに送信するプログラム。 メモリー上の&HE000から&HE300までのデータを送信します。 10 Term J,0,4 ’データ長8ビット、パリティ無し、1200ボー 20 For I=&HE000 to &HE300 30 D=Peek(I) ’メモリーのバイナリデータを読む 40 Print %1,HEX$(D); ’文字型に変換してRS232Cから送信 50 Next BASICプログラム送信の試み 機械語でないとBASICプログラムをRS232Cで送信するプログラムはできなさそう ですが、PC2001の技術資料がなく、機械語での試みは難儀をきわめています。 ROM部(BASICシステム)を全部DOS/Vに転送し、DOS/VにPC2001 ディスアセンブラを作成し、それでROM解析をして、PC2001のROMルーチン を利用したRS232C転送プログラムを機械語で組むという構想を描いておりますが、 ROMの解析がすすんでおりません。 そこで、All BasicでRS232C経由でプログラムをやりとりするものができないかという、 安易な考えに取り付かれ、ちょっとBASICに浮気しました。 10回以上PC2001を暴走させた結果、まったく実用にはならないひどいものながら、 PC2001<-->DOS/VでBasicプログラム(中間コードとして)をやりとりする試験用プログラム の作成に成功しました。これはPC2001のBasicプログラムをRS232C経由で入出力 するものです。 start address E001 end address E2EE 5 TERM J, 0, 4 10 INPUT "peek..p poke..q teso..t シリアルout...o シリアルin...i program start..s";Q$ 15 IF Q$ = "i" THEN GOTO 140 16 IF Q$ = "o" THEN GOTO c 18 IF Q$ = "s" THEN GOTO 200 20 IF Q$ = "p" THEN GOTO 30 22 IF Q$ = "t" THEN GOTO 110 25 IF Q$ = "q" THEN GOTO 60 28 GOTO 10 30 INPUT "adreess";A 40 FOR I = A TO A + 20 45 PRINT HEX$(PEEK(I)) + ","; 50 NEXT 51 PRINT 55 GOTO 10 60 INPUT "adress"; W 70 PRINT HEX$(W);:INPUT "data";D 80 IF D > = 256 THEN GOTO 10 90 POKE W,D 95 W = W + 1 100 GOTO 70 110 INPUT "テンソウモトstart address";ST:INPUT "end address";EN:INPUT "テンソウサキ(&h )";AD: 115 FOR I = 0 TO EN - ST 120 POKE AD + I,PEEK(ST + I) 125 NEXT 130 GOTO 10 140 I = 0 145 INPUT % 1, K$ 150 IF K$ = "ok" THEN GOTO 10 155 POKE &HE500 + I, VAL("&h" + K$) 158 I = I + 1 160 GOTO 145 170 FOR I = &HF90C TO &HF90F 175 PRINT % 1, HEX$(PEEK(I)) + ","; 180 NEXT 185 FOR I = &HE000 TO PEEK(&HF90E) + PEEK(&HF90F) * 256 - 65535 190 PRINT % 1, HEX$(PEEK(I)) + ","; 195 NEXT 198 GOTO 10 200 REM 3 このリストは自分自身をRS232C経由でDOS/Vに送り、DOS/V上に作った、 PC2001中間コード解析プログラムでテキスト化したものです。 RUNするとコマンド待ちの状態になります。 pで指定番地から20個分メモリダンプします。 qで指定番地のメモリに書き込みます。 tでメモリの内容を転送元指定番地から転送先にブロック転送します。 oでプログラムをRS232Cより転送します。まずbasicプログラム開始番地、 終了番地を転送し、つづいて中間コードを転送します。 iでRS232Cより受信したデータを&HE500番地よりストアします。"OK"を 受信すれば終了。 sで行番号200に飛びます。200以降に本来のプログラムを追加すれば、そのプログラム が実行されます。 プログラムの転送はoで自動的にやります。しかし、入力(すなわちロード)はやっかいです。 iコマンドで&HE500にストアしたのち、tコマンドで適切な番地に転送します。 お、その前にqコマンドでプログラム終了番地を修正しなくてはなりません。 (解析の結果、Basicプログラム終了番地は&HF90E,&HF90Fに格納されて いることがわかっている。)ただし、このプログラムで、すなわちPOKEで&HF90E, &HF90Fにデータ書き込みすると、(ここは本来システム領域なので、書き込み禁止) 暴走して何も表示しなくなる。しかし、一度電源をOFFして、再度ONすると無事 復帰する。(PC2001のメモリは不揮発メモリなので電源OFFでもプログラムは 消えない)いずれにせよ、こういう使えないしろものです。 いずれのプログラムにしても、この200行までの部分を瘤のようにつけておけば、 RS232C経由で転送、受信できるという、まったく馬鹿げたしろものです。 BASICではこういう瘤のようなものしかできないでしょう。 ちなみに、この実験ようプログラムはGOTOの多用というプログラミング自体 最低なものですが、まあ、実験ようなので気にしない、気にしない。 (3) DOS/V機でのRS232Cによるデータ送受信他 いままで、データの送信について主にのべました。データの受信も各パソコンでできますが、 目下、筆者の主眼は古いパソコンのデータファイル、各言語のソースファイルをDOS/V機 に持ってくることなので、データの受信については、DOS/V機でしか深く検討しておりません。 DOS/V機上ではWINDOWS95以上で動作するきちんとしたRS232C通信プログラムを 作成しておりますが、プログラム自体も長大なものになっておりますので、ここでの説明は 省略します。当原稿に関連したプログラムとしては以下のものを作成済みです。 関連サイトのパソコン活用研究5番街にいくつか掲載していますので、参照して下さい。 @ PC2001 *RS232Cによるプログラムローダー(All 機械語) これは、ふるーいThe Basicの記事を 参考に組んだものです。機械語でPC2001のBASICプログラムをRS232Cで送受信 するものです。 A DOS/V *RS232Cによるシリアルデータ送受信プログラム *PC2001中間コード解析 昔、FM-8とPC2001をカセットインターフェイス で結線しデータ送信させました。この時PC2001から送信したPC2001のBasic プログラムの中間コードをFM-8上で解析し元のテキストファイル化するプログラムを 組みました。それを移植したものです。 *PC2001ディスアセンブラ これも昔FM-8で組んだものの移植です。PC2001 のROM部(BASICシステム)のデータを解析するために作成。 当原稿はRS232Cによるシリアルデータ通信の概説を主眼にしておりますので、上記 プログラムの説明は別の機会にということにします。なお、昔やったPC2001とFM-8間の データ通信については、拙著「PCList解説−FM8とPC2201データ通信プロジェクト」 にまとめましたので、そちらを参考にして下さい。シリアルデータ通信について別の角度から とりあげてます。 |